#include<iostream>
#include<cstdio>
#include<deque>
using namespace std;
int n,m,mp[100][100],fx[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int Ans,dis[100][100];
bool ex[100][100];
deque <pair<int,int>> q;
int find(int x,int y){
    int cnt=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            dis[i][j]=n*m;
            ex[i][j]=true;
        }
    }
    dis[x][y]=0;
    q.push_front({x,y});
    while(!q.empty()){
        pair<int,int> u=q.front();
        if(!ex[u.first][u.second]){
            q.pop_front();
            continue;
        }
        ex[u.first][u.second]=false;
        cnt=max(cnt,dis[u.first][u.second]);
        q.pop_front();
        for(int i=0;i<4;i++){
            int xx=u.first+fx[i][0];
            int yy=u.second+fx[i][1];
            if(xx==0||yy==0||xx==(n+1)||yy==(m+1)||!ex[xx][yy]){continue;}
            if(mp[xx][yy]==mp[u.first][u.second]){
                dis[xx][yy]=min(dis[xx][yy],dis[u.first][u.second]);
                q.push_front({xx,yy});
            }
            else{
                dis[xx][yy]=min(dis[xx][yy],dis[u.first][u.second]+1);
                q.push_back({xx,yy});
            }
        }
    }
    if(((cnt&1)^mp[x][y])==1){
        cnt++;
//        printf("%d %d %d\n",x,y,cnt);
    }
    return cnt;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&mp[i][j]);
        }
    }
    Ans=n*m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            Ans=min(find(i,j),Ans);
            if(Ans==find(i,j)){
                //printf("%d %d\n",i,j);
            }
        }
    }
    printf("%d\n",Ans);
    return 0;
}